Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Damagucci-Juice] step3 델리게이트 프로토콜로 작동하던 것을 노티피케이션 센터를 이용해서 설정 #90

Open
wants to merge 18 commits into
base: gucci
Choose a base branch
from

Conversation

Damagucci-Juice
Copy link

작업 내용

  • Delegate로 작동하는 것을 NotificationCenter 를 이용하도록 설정
    • 사각형 추가 기능
    • rectangle view 를 터치하면 테두리 설정
    • rectangle color 변경
    • rectangle alpha 변경

질문거리

  • object 에 담을 수 있는 것은 UIView 종류인 것인가요?
        notificationCenter.addObserver(self, selector: #selector(made(rectangleNoti: )), name: Notification.Name.addRectangleView, object: nil)

object 부분에 plane 을 넣으면 안되고, nil 을 넣으면 되고 이게 무슨 차이인지 모르겠습니다.

  • Notification 설정 관련 하여, Name 과 Key를 무슨 기준으로 네이밍하면 좋을까요?
let notificationCenter = NotificationCenter.default

extension Notification.Name {
    static let addRectangleView = Notification.Name("A rectangle is made")
    static let tappedRectangleView = Notification.Name("a rectangle view is Tapped")
    static let colorChange = Notification.Name("color changed")
    static let alphaChange = Notification.Name("alpha changed")
}

enum NotificationKey {
    case color
    case alpha
    case tappedRectangle
    case addedRectangle
}

부연설명

다마구찌 개인 공부 블로그 에 NotificationCenter 의 아주 기초적인 설정 순서를 정리해두었습니다.

구현화면

drawing-step3

@godrm
Copy link
Contributor

godrm commented Mar 16, 2022

질문거리

  • object 에 담을 수 있는 것은 UIView 종류인 것인가요?
        notificationCenter.addObserver(self, selector: #selector(made(rectangleNoti: )), name: Notification.Name.addRectangleView, object: nil)

object 부분에 plane 을 넣으면 안되고, nil 을 넣으면 되고 이게 무슨 차이인지 모르겠습니다.

그걸 찾아내야죠! ㅎㅎ object의 타입은 무엇으로 되어 있던가요?
plane 타입은 무엇으로 선언했나요? UIView는 무엇으로 선언되어 있나요?
Observer 수업할 때 언급했던 게 있습니다. 그게 힌트가 되겠네요

  • Notification 설정 관련 하여, Name 과 Key를 무슨 기준으로 네이밍하면 좋을까요?

글쎄요. 좀 광범위한 질문이네요. 항상 질문을 할 때는 본인이 시도한 것, 본인이 작성한 기준을 설명해주면 좋을 것 같습니다.
질문이 너무 광범위하게 무슨 기준이 좋을까요? 하면 읽기 쉽고 local reasoning이 되고 객관적으로 구체적이면 좋습니다 정도 답변이 되겠네요
본인의 작업, 기준, 코드를 놓고 얘기하면 더 구체적인 사례도 많이 이야기할 수 있을 것 같아요

Copy link
Contributor

@godrm godrm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체적으로 잘 구현하셨는데, 몇 가지 의견을 남겼습니다.
NotificationCenter를 다루는 부분들만 수정하고 넘어가면 될 것 같습니다.


import Foundation

let notificationCenter = NotificationCenter.default
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotificationCenter.default를 이렇게 줄이는 게 썩 좋은 표현이나 접근이 아닙니다.
싱글톤으로 접근하는 NotificationCenter.default 이런 값을 참조해 놓는 것이 좋지 않은 경우도 있습니다. 줄여쓰는 효과가 있는게 아니면 그대로 써도 됩니다.
NotificationCenter는 덜하지만 default가 참조하는 포인터가 바뀌는 경우도 있습니다. 그래서 이렇게 담아놓으면 다른 인스턴스를 가르킬 수도 있습니다. 싱글톤을 쓸 때는 그냥 이걸 쓰는게 더 좋습니다.

Comment on lines 12 to 23
extension Notification.Name {
static let addRectangleView = Notification.Name("A rectangle is made")
static let tappedRectangleView = Notification.Name("a rectangle view is Tapped")
static let colorChange = Notification.Name("color changed")
static let alphaChange = Notification.Name("alpha changed")
}

enum NotificationKey {
case color
case alpha
case tappedRectangle
case addedRectangle
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

노티는 행위에 가깝고, 키는 변수에 가까우니 그런 형태면 좋을 것 같고. 그외에는 겹치지 않는지. 명확한 의도를 전달하는 지 살펴보면 될 것 같습니다.
그리고 상수는 항상 관련있는 타입이 있습니다. 사용하는 타입도 있고, 전송하는 타입도 있죠. 어떤 타입과 관련이 높은지 살펴보고 응집도 높게 합쳐보세요.

@@ -31,15 +11,13 @@ class Plane {
func addRectangle() {
let rectangle: Rectangle = Factory.createRandomRectangle()
rectangles.append(rectangle)

addedRectangleDelegate?.made(rectangle: rectangle)
notificationCenter.post(name: .addRectangleView, object: nil, userInfo: [NotificationKey.addedRectangle : rectangle])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotificationCenter의 object는 sender의 의미라서 보내는 객체도 항상 지정해주는 게 좋습니다. 그래야 옵저버 조건에서 매칭이 가능합니다

notificationCenter.addObserver(self, selector: #selector(didChangeColor(rectangleNoti:)), name: Notification.Name.colorChange, object: nil)

// alpha changed
notificationCenter.addObserver(self, selector: #selector(didChangeAlpha(rectangleNoti: )), name: Notification.Name.alphaChange, object: nil)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

옵저버를 등록할 때도 가능하면 object (sender)를 지정해주는 게 좋습니다. 그래야 그 타입이 보내는 그 메시지를 받을 수 있죠.
물론 모든 타입이 보내는 메시지를 받을 때는 생략 가능합니다

Comment on lines 69 to 75
activateNotificationObservers()
initDetailView()
touchBackgroundView()
activateBackgroundTappable()
}

override func viewDidDisappear(_ animated: Bool) {
notificationCenter.removeObserver(self)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

viewDidLoad는 뷰 컨트롤러 생성되고 한 번만 호출되지만, viewDidDisappear는 다른 뷰로 넘어가도 불리고 여러번 불릴 수 있죠.
만약 이렇게 짝을 지으면 다른 뷰 컨트롤로 화면으로 넘어갔다 돌아오면 그 때부터 노티를 못 받습니다. 그래도 될까요?


viewDidDisappear() 처럼 override 하는 함수는 꼭 super.xxx를 호출해주셔야 합니다. 그렇지 않으면 그 상태가 된 다음에 오동작을 할 수 있습니다.

@@ -107,7 +122,11 @@ extension ViewController: RectangleTouchedDelegate {
alphaSlider.value = Float(rect.alpha.rawValue)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for (key, value) in rectangleAndViewContainer 에서 view로 찾는 것은 좀 이상한데요.
이렇게 찾을꺼면 key를 view로 하는 게 맞는 거구요,
showDetailOfColorAndAlpha()를 어디서 호출하는 지 모르겠지만 view로 찾지 말고 rectangle로 view를 찾는 게 적당합니다.

extension ViewController : RectangleAlaphaChangeDelegate {
func didChangeAlpha(rectangle: Rectangle) {
extension ViewController {
@objc func didChangeAlpha(rectangleNoti: Notification) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rectangleNoti 는 notification의 이름으로 부정확한 것 같습니다.
사각형태노티(그런게 있는지 모르겠지만)인지, 사각형에 대한 노티인지, 사각형 변화에 대한 노티인지 모르겠습니다.
그럴수록 단어를 억지로 줄여쓰지 않는게 좋습니다.

Copy link
Author

@Damagucci-Juice Damagucci-Juice Mar 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@objc func didChangeAlpha(from plane: Notification) {

플레인으로 부터 온 노티피케이션이라고 표현을 해보았는데 괜찮을까요?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants